class Compl
{
private:

    double re, im;

public:

// конструкторы
  Compl ()
  {
  };

  Compl (double r)
  {
    re = r;
    im = 0;
  }

  Compl (double r, double i)
  {
    re = r;
    im = i;
  }

// конструктор копирования
  Compl (const Compl &c)
  {
    re = c.re;
    im = c.im;
  }

// деструктор
  ~Compl ()
  {
  }

// модуль комплексного числа
  double fabs ()
  {
    return sqrt (re * re + im * im);
  }

// перегрузка операторов
  Compl& operator = (Compl &c)
  {
    re = c.re;
    im = c.im;
    return (*this);
  }

  Compl operator + (const Compl &c)
  {
    return Compl (re + c.re, im + c.im);
  }

  Compl operator - (const Compl &c)
  {
    return Compl(re - c.re, im - c.im);
  }

  Compl operator * (const Compl &c)
  {
    return Compl(re * c.re - im * c.im, re * c.im + im * c.re);
  }


  Compl operator / (const Compl &c)
  {
    Compl temp;

    double r = c.re * c.re + c.im * c.im;
    temp.re = (re * c.re + im * c.im) / r;
    temp.im = (im * c.re - re * c.im) / r;

    return temp;
  }

// дружественные функции
  friend ostream & operator<< (ostream &, const Compl &);
  friend istream & operator>> (istream &, Compl &);

};

// перегрузка операторов ввода и вывода
ostream& operator<< (ostream &out, const Compl &c)
{
    if (c.im<0)
  out << c.re << c.im << "i";
    else
  out << c.re << "+" << c.im << "i";
  return out;
}

istream& operator>> (istream &in, Compl &c)
{
  in >> c.re >> c.im;
  return in;
}
